﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Ext.Net;
using Ent.Inscripcion.Core.Administracion;
using Ent.Inscripcion.Core.Core;

namespace Ent.Inscripcion.Presentacion
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!X.IsAjaxRequest)
            {
                CargarTutorias();
                CargarExamenes();
                CargarRequisitos();
            }

        }

        int ObtenerIndiceMayor(int[] arreglo)
        {
            var max = 0; var indiceMax = 0;
            for (int i = 0; i < 6; i++)
            {
                if (arreglo[i] > max)
                {
                    indiceMax = i;
                    max = arreglo[i];
                }
            }
            return indiceMax;
        }

        void CargarTutorias()
        {
            var listaTutorias = HorarioTutoriaLista.GetHorarioTutoriaLista(HorarioTutoriaCriterio.NewHorarioTutoriaCriterio());
            List<object> data = new List<object>();
            List<object> horario;
            List<DatosHorario> horarioL;
            List<DatosHorario> horarioM;
            List<DatosHorario> horarioMi;
            List<DatosHorario> horarioJ;
            List<DatosHorario> horarioV;
            List<DatosHorario> horarioS;

            var listaTutoriaNivel = listaTutorias.GroupBy(t => t.NivelId);
            var nivel = "";
            foreach (var horarioNivel in listaTutoriaNivel)
            {
                var horarioDias = horarioNivel.GroupBy(t => t.Dia);
                horario = new List<object>();
                horarioL = new List<DatosHorario>();
                horarioM = new List<DatosHorario>();
                horarioMi = new List<DatosHorario>();
                horarioJ = new List<DatosHorario>();
                horarioV = new List<DatosHorario>();
                horarioS = new List<DatosHorario>();
                foreach (var horarioDia in horarioDias)
                {
                    foreach (var item in horarioDia)
                    {
                        nivel = item.Nivel;
                        
                        switch (item.Dia)
                        {
                            case "Lunes":
                                horarioL.Add(new DatosHorario
                                {
                                    HoraInicio = item.HoraInicio.ToShortTimeString(),
                                    HoraFin = item.HoraFin.ToShortTimeString(),
                                    Aula = "Aula:&nbsp;" + item.Aula,
                                    Paralelo = "Paralelo:&nbsp;" + item.Paralelo,
                                    Docente = item.Docente
                                });
                                break;
                            case "Martes":
                                horarioM.Add(new DatosHorario
                                {
                                    HoraInicio = item.HoraInicio.ToShortTimeString(),
                                    HoraFin = item.HoraFin.ToShortTimeString(),
                                    Aula = "Aula:&nbsp;" + item.Aula,
                                    Paralelo = "Paralelo:&nbsp;" + item.Paralelo,
                                    Docente = item.Docente
                                });
                                break;
                            case "Miercoles":
                                horarioMi.Add(new DatosHorario
                                {
                                    HoraInicio = item.HoraInicio.ToShortTimeString(),
                                    HoraFin = item.HoraFin.ToShortTimeString(),
                                    Aula = "Aula:&nbsp;" + item.Aula,
                                    Paralelo = "Paralelo:&nbsp;" + item.Paralelo,
                                    Docente = item.Docente
                                });
                                break;
                            case "Jueves":
                                horarioJ.Add(new DatosHorario
                                {
                                    HoraInicio = item.HoraInicio.ToShortTimeString(),
                                    HoraFin = item.HoraFin.ToShortTimeString(),
                                    Aula = "Aula:&nbsp;" + item.Aula,
                                    Paralelo = "Paralelo:&nbsp;" + item.Paralelo,
                                    Docente = item.Docente
                                });
                                break;
                            case "Viernes":
                                horarioV.Add(new DatosHorario
                                {
                                    HoraInicio = item.HoraInicio.ToShortTimeString(),
                                    HoraFin = item.HoraFin.ToShortTimeString(),
                                    Aula = "Aula:&nbsp;" + item.Aula,
                                    Paralelo = "Paralelo:&nbsp;" + item.Paralelo,
                                    Docente = item.Docente
                                });
                                break;
                            case "Sabado":
                                horarioS.Add(new DatosHorario
                                {
                                    HoraInicio = item.HoraInicio.ToShortTimeString(),
                                    HoraFin = item.HoraFin.ToShortTimeString(),
                                    Aula = "Aula:&nbsp;" + item.Aula,
                                    Paralelo = "Paralelo:&nbsp;" + item.Paralelo,
                                    Docente = item.Docente
                                });
                                break;
                            default:
                                break;
                        }
                    }
                }
                int[] numElementos = new int[6];
                numElementos[0] = horarioL.Count;
                numElementos[1] = horarioM.Count;
                numElementos[2] = horarioMi.Count;
                numElementos[3] = horarioJ.Count;
                numElementos[4] = horarioV.Count;
                numElementos[5] = horarioS.Count;
                var indiceMayor = ObtenerIndiceMayor(numElementos);

                var numMayor = numElementos[indiceMayor];

                #region "Igualar Arreglos"
                for (int j = 0; j < 6; j++)
                {
                    for (int i = numElementos[j]; i < numMayor; i++)
                    {
                        switch (j)
                        {
                            case 0:
                                horarioL.Add(new DatosHorario
                                {
                                    HoraInicio = "",
                                    HoraFin = "",
                                    Aula = "",
                                    Paralelo = "",
                                    Docente = ""
                                });
                                break;
                            case 1:
                                horarioM.Add(new DatosHorario
                                {
                                    HoraInicio = "",
                                    HoraFin = "",
                                    Aula = "",
                                    Paralelo = "",
                                    Docente = ""
                                });
                                break;
                            case 2:
                                horarioMi.Add(new DatosHorario
                                {
                                    HoraInicio = "",
                                    HoraFin = "",
                                    Aula = "",
                                    Paralelo = "",
                                    Docente = ""
                                });
                                break;
                            case 3:
                                horarioJ.Add(new DatosHorario
                                {
                                    HoraInicio = "",
                                    HoraFin = "",
                                    Aula = "",
                                    Paralelo = "",
                                    Docente = ""
                                });
                                break;
                            case 4:
                                horarioV.Add(new DatosHorario
                                {
                                    HoraInicio = "",
                                    HoraFin = "",
                                    Aula = "",
                                    Paralelo = "",
                                    Docente = ""
                                });
                                break;
                            case 5:
                                horarioS.Add(new DatosHorario
                                {
                                    HoraInicio = "",
                                    HoraFin = "",
                                    Aula = "",
                                    Paralelo = "",
                                    Docente = ""
                                });
                                break;
                            default:
                                break;
                        }
                    }
                }


                #endregion

                for (int i = 0; i < numMayor; i++)
                {
                    horario.Add(new
                    {
                        HoraInicioL = horarioL[i].HoraInicio,
                        HoraFinL = horarioL[i].HoraFin,
                        AulaL = horarioL[i].Aula,
                        ParaleloL = horarioL[i].Paralelo,
                        DocenteL = horarioL[i].Docente,

                        HoraInicioM = horarioM[i].HoraInicio,
                        HoraFinM = horarioM[i].HoraFin,
                        AulaM = horarioM[i].Aula,
                        ParaleloM = horarioM[i].Paralelo,
                        DocenteM = horarioM[i].Docente,

                        HoraInicioMi = horarioMi[i].HoraInicio,
                        HoraFinMi = horarioMi[i].HoraFin,
                        AulaMi = horarioMi[i].Aula,
                        ParaleloMi = horarioMi[i].Paralelo,
                        DocenteMi = horarioMi[i].Docente,

                        HoraInicioJ = horarioJ[i].HoraInicio,
                        HoraFinJ = horarioJ[i].HoraFin,
                        AulaJ = horarioJ[i].Aula,
                        ParaleloJ = horarioJ[i].Paralelo,
                        DocenteJ = horarioJ[i].Docente,

                        HoraInicioV = horarioV[i].HoraInicio,
                        HoraFinV = horarioV[i].HoraFin,
                        AulaV = horarioV[i].Aula,
                        ParaleloV = horarioV[i].Paralelo,
                        DocenteV = horarioV[i].Docente,

                        HoraInicioS = horarioS[i].HoraInicio,
                        HoraFinS = horarioS[i].HoraFin,
                        AulaS = horarioS[i].Aula,
                        ParaleloS = horarioS[i].Paralelo,
                        DocenteS = horarioS[i].Docente
                    });
                }

                data.Add(new { Nivel = nivel, Horarios = horario });
            }

            this.stoTutorias.DataSource = data;
            this.stoTutorias.DataBind();
        }
        void CargarExamenes()
        {
            var listaExamens = HorarioExamenLista.GetHorarioExamenLista(HorarioExamenCriterio.NewHorarioExamenCriterio());
            List<object> data = new List<object>();
            List<object> horario;
            List<DatosHorario> horarioL;
            List<DatosHorario> horarioM;
            List<DatosHorario> horarioMi;
            List<DatosHorario> horarioJ;
            List<DatosHorario> horarioV;
            List<DatosHorario> horarioS;

            var listaExamenNivel = listaExamens.GroupBy(t => t.Nivel);
            var nivel = "";
            foreach (var horarioNivel in listaExamenNivel)
            {
                var horarioDias = horarioNivel.GroupBy(t => t.Dia);
                horario = new List<object>();
                horarioL = new List<DatosHorario>();
                horarioM = new List<DatosHorario>();
                horarioMi = new List<DatosHorario>();
                horarioJ = new List<DatosHorario>();
                horarioV = new List<DatosHorario>();
                horarioS = new List<DatosHorario>();
                foreach (var horarioDia in horarioDias)
                {
                    foreach (var item in horarioDia)
                    {
                        nivel = item.Nivel;
                        switch (item.Dia)
                        {
                            case "Lunes":
                                horarioL.Add(new DatosHorario
                                {
                                    HoraInicio = item.HoraInicio.ToShortTimeString(),
                                    HoraFin = item.HoraFin.ToShortTimeString(),
                                    Aula = "Aula:&nbsp;" + item.Aula
                                });
                                break;
                            case "Martes":
                                horarioM.Add(new DatosHorario
                                {
                                    HoraInicio = item.HoraInicio.ToShortTimeString(),
                                    HoraFin = item.HoraFin.ToShortTimeString(),
                                    Aula = "Aula:&nbsp;" + item.Aula
                                });
                                break;
                            case "Miercoles":
                                horarioMi.Add(new DatosHorario
                                {
                                    HoraInicio = item.HoraInicio.ToShortTimeString(),
                                    HoraFin = item.HoraFin.ToShortTimeString(),
                                    Aula = "Aula:&nbsp;" + item.Aula
                                });
                                break;
                            case "Jueves":
                                horarioJ.Add(new DatosHorario
                                {
                                    HoraInicio = item.HoraInicio.ToShortTimeString(),
                                    HoraFin = item.HoraFin.ToShortTimeString(),
                                    Aula = "Aula:&nbsp;" + item.Aula
                                });
                                break;
                            case "Viernes":
                                horarioV.Add(new DatosHorario
                                {
                                    HoraInicio = item.HoraInicio.ToShortTimeString(),
                                    HoraFin = item.HoraFin.ToShortTimeString(),
                                    Aula = "Aula:&nbsp;" + item.Aula
                                });
                                break;
                            case "Sabado":
                                horarioS.Add(new DatosHorario
                                {
                                    HoraInicio = item.HoraInicio.ToShortTimeString(),
                                    HoraFin = item.HoraFin.ToShortTimeString(),
                                    Aula = "Aula:&nbsp;" + item.Aula
                                });
                                break;
                            default:
                                break;
                        }
                    }
                }
                int[] numElementos = new int[6];
                numElementos[0] = horarioL.Count;
                numElementos[1] = horarioM.Count;
                numElementos[2] = horarioMi.Count;
                numElementos[3] = horarioJ.Count;
                numElementos[4] = horarioV.Count;
                numElementos[5] = horarioS.Count;
                var indiceMayor = ObtenerIndiceMayor(numElementos);

                var numMayor = numElementos[indiceMayor];

                #region "Igualar Arreglos"
                for (int j = 0; j < 6; j++)
                {
                    for (int i = numElementos[j]; i < numMayor; i++)
                    {
                        switch (j)
                        {
                            case 0:
                                horarioL.Add(new DatosHorario
                                {
                                    HoraInicio = "",
                                    HoraFin = "",
                                    Aula = "",
                                    Paralelo = "",
                                    Docente = ""
                                });
                                break;
                            case 1:
                                horarioM.Add(new DatosHorario
                                {
                                    HoraInicio = "",
                                    HoraFin = "",
                                    Aula = "",
                                    Paralelo = "",
                                    Docente = ""
                                });
                                break;
                            case 2:
                                horarioMi.Add(new DatosHorario
                                {
                                    HoraInicio = "",
                                    HoraFin = "",
                                    Aula = "",
                                    Paralelo = "",
                                    Docente = ""
                                });
                                break;
                            case 3:
                                horarioJ.Add(new DatosHorario
                                {
                                    HoraInicio = "",
                                    HoraFin = "",
                                    Aula = "",
                                    Paralelo = "",
                                    Docente = ""
                                });
                                break;
                            case 4:
                                horarioV.Add(new DatosHorario
                                {
                                    HoraInicio = "",
                                    HoraFin = "",
                                    Aula = "",
                                    Paralelo = "",
                                    Docente = ""
                                });
                                break;
                            case 5:
                                horarioS.Add(new DatosHorario
                                {
                                    HoraInicio = "",
                                    HoraFin = "",
                                    Aula = "",
                                    Paralelo = "",
                                    Docente = ""
                                });
                                break;
                            default:
                                break;
                        }
                    }
                }


                #endregion

                for (int i = 0; i < numMayor; i++)
                {
                    horario.Add(new
                    {
                        HoraInicioL = horarioL[i].HoraInicio,
                        HoraFinL = horarioL[i].HoraFin,
                        AulaL = horarioL[i].Aula,
                        ParaleloL = horarioL[i].Paralelo,
                        DocenteL = horarioL[i].Docente,

                        HoraInicioM = horarioM[i].HoraInicio,
                        HoraFinM = horarioM[i].HoraFin,
                        AulaM = horarioM[i].Aula,
                        ParaleloM = horarioM[i].Paralelo,
                        DocenteM = horarioM[i].Docente,

                        HoraInicioMi = horarioMi[i].HoraInicio,
                        HoraFinMi = horarioMi[i].HoraFin,
                        AulaMi = horarioMi[i].Aula,
                        ParaleloMi = horarioMi[i].Paralelo,
                        DocenteMi = horarioMi[i].Docente,

                        HoraInicioJ = horarioJ[i].HoraInicio,
                        HoraFinJ = horarioJ[i].HoraFin,
                        AulaJ = horarioJ[i].Aula,
                        ParaleloJ = horarioJ[i].Paralelo,
                        DocenteJ = horarioJ[i].Docente,

                        HoraInicioV = horarioV[i].HoraInicio,
                        HoraFinV = horarioV[i].HoraFin,
                        AulaV = horarioV[i].Aula,
                        ParaleloV = horarioV[i].Paralelo,
                        DocenteV = horarioV[i].Docente,

                        HoraInicioS = horarioS[i].HoraInicio,
                        HoraFinS = horarioS[i].HoraFin,
                        AulaS = horarioS[i].Aula,
                        ParaleloS = horarioS[i].Paralelo,
                        DocenteS = horarioS[i].Docente
                    });
                }

                data.Add(new { Nivel = nivel, Horarios = horario });
            }

            this.stoExamenes.DataSource = data;
            this.stoExamenes.DataBind();
        }
        void CargarRequisitos()
        {
            var listaRequisitos = RequisitoLista.GetRequisitoLista(RequisitoCriterio.NewRequisitoCriterio());
            List<object> data = new List<object>();
            List<object> requisito;
            var tipo="";
            var requisitoAmbos = listaRequisitos.Where(r => r.Tipo == "Ambos");
            var requisitoTipos = listaRequisitos.Where(r => r.Tipo != "Ambos").GroupBy(r => r.Tipo);
            requisito = new List<object>();
            /*foreach (var requisitoInfo in requisitoAmbos)
            {
                requisito.Add(new
                {
                    Requisito = requisitoInfo.Nombre
                });
            }
            data.Add(new { Tipo = "Examen y Tutoria", Requisitos = requisito });*/
            foreach (var rt in requisitoTipos)
            {
                requisito = new List<object>();
                foreach (var requisitoInfo in rt)
                {
                    tipo = requisitoInfo.Tipo;
                    requisito.Add(new
                    {
                        Requisito = requisitoInfo.Nombre
                    });
                }
                data.Add(new { Tipo = tipo, Requisitos = requisito });
            }
            
            stoRequisitos.DataSource = data;
            stoRequisitos.DataBind();
        }
    }
    public class DatosHorario
    {
        public string HoraInicio;
        public string HoraFin;
        public string Aula;
        public string Paralelo;
        public string Docente;
    }
}